package decorator;


import decorator.component.impl.CoconutMilk;
import decorator.component.Drink;
import decorator.component.impl.SimpleCoffee;
import decorator.decorator.impl.MilkDecorator;
import decorator.decorator.impl.MochaDecorator;

/**
 * 装饰器模式主程序
 * 装饰器（Decorator）模式 动态地给一个对象添加一些额外的职责。就增加功能来说，相比生成子类更为灵活。
 *
 * @author Liu Yicong
 * @date 2025/9/21
 */
public class DecoratorClient {
	public static void main(String[] args) {
		// 基础咖啡
		Drink simpleCoffee = new SimpleCoffee();
		printOrder(simpleCoffee); // 简单的黑咖啡
		System.out.println("-------------------------");

		// 添加牛奶：使用 MilkDecorator 包装 coffee
		simpleCoffee = new MilkDecorator(simpleCoffee);
		printOrder(simpleCoffee); // 简单的黑咖啡, 加牛奶
		System.out.println("-------------------------");

		// 再添加摩卡：使用 MochaDecorator 包装 **已加牛奶的咖啡**
		simpleCoffee = new MochaDecorator(simpleCoffee);
		printOrder(simpleCoffee); // 简单的黑咖啡, 加牛奶, 加摩卡
		System.out.println("-----------新的订单-----------");

		// 新的订单：摩卡双份
		Drink strongMocha = new MochaDecorator(new MochaDecorator(new SimpleCoffee()));
		printOrder(strongMocha); // 简单的黑咖啡, 加摩卡, 加摩卡
		System.out.println("-----------新的订单-----------");

		// 基础椰乳
		Drink coco = new CoconutMilk();
		printOrder(coco); // 简单的椰乳
		System.out.println("-------------------------");

		// 添加牛奶：使用 MochaDecorator 包装 coco
		coco = new MochaDecorator(coco);
		printOrder(coco); // 简单的黑咖啡, 加摩卡
		System.out.println("-------------------------");
	}

	private static void printOrder(Drink drink) {
		System.out.println("订单: " + drink.getDescription());
		System.out.println("价格: " + drink.getCost() + " 元");
	}
}
